package telecom

import (
	"bserver/pkg/http"
	"fmt"
	"log"
)

// 模拟B接口的SC服务器，用于测试

const (
	// TelecomSCPath 移动SC接口路径
	TelecomSCPath = "/services/SCService"
)

// Telecom 代表移动服务，包含对移动功能的描述和配置。
type Telecom struct {
	biSvr          *http.BiSvr                 // 用于与BI服务器交互的实例。
	enableTLS      bool                        // 是否启用TLS加密。
	enableSoap     bool                        // 是否启用SOAPAction，默认为false。
	isRunning      bool                        // 记录goroutine是否在运行
	doReg          bool                        // 是否需要马上注册。true 需要马上执行注册，false则不用执行
	Uptime         int                         //模块启动计数
	ctrlInterToExt func(int, string, any, any) // 模块内部控制外部的回调函数,int为服务器标识0 sc1 ,1 sc2,第一个any是输入参数，第二个any是输出参数
}

// NewTelecom 创建一个新的Telecom实例。
func NewTelecom() *Telecom {
	Telecom := Telecom{}
	addr := "0.0.0.0:8090"
	Telecom.biSvr = http.NewBiSvr(addr, "", TelecomSCPath, false, true, nil)
	Telecom.enableTLS = false
	Telecom.enableSoap = true
	Telecom.Uptime = 0
	Telecom.biSvr.SetCB(func(r any, rbody string, wbody *string) error {
		return Telecom.handleSCReq(r, rbody, wbody)
	})
	return &Telecom
}

// 处理SU上送的请求
func (p *Telecom) handleSCReq(r any, rbody string, wbody *string) error {
	var reqContent string
	var err error
	log.Printf("handleSCReq p.enableTLS:%t p.EnableSoap:%t\n ", p.enableTLS, p.enableSoap)
	if p.enableSoap == false {
		reqContent = rbody
	} else {
		log.Printf("rbody(xml): \n%s\n", rbody)
		reqContent, err = ParseReqXMLData(rbody)
		if err != nil {
			log.Printf("ParseReqXMLData failed: %s\n", err)
			return err
		}
	}

	// 处理各种SC类型B接口SC指令
	var resp string
	req := Request{}
	pkType := req.ParsePKType(reqContent)
	log.Printf("pkType:%s\n", pkType)

	switch pkType {
	case "LOGIN":
		resp, err = p.Login(reqContent)
		log.Printf("Login: \n%s\n", resp)
	case "ASK_FACTORYCONFIG":
		resp, err = p.AskFactoryconfig(reqContent)
	case "SEND_FACTORYCONFIG":
		resp, err = p.SendFactoryconfig(reqContent)
	default:
		log.Println("scResp:", err)
	}

	if p.enableSoap == false {
		*wbody = resp
	} else {
		// 返回应答数据
		*wbody, err = GenRespXMLData(resp)
		if err != nil {
			log.Println("GenRespSXMLData:", err)
			return err
		}
	}

	return nil
}

// CtrlHandleFunc 设置回调函数
func (p *Telecom) CtrlHandleFunc(cb func(int, string, any, any)) {
	p.ctrlInterToExt = cb
}

// ********************************************************************
// sc 服务启动与停止

// Start 启动服务
func (p *Telecom) Start() error {
	err := p.biSvr.Start()
	if err != nil {
		log.Println("p.biSvr.Start(), err:", err)
		return err
	}

	return nil
}

// Stop 停止服务
//
// 参数:
// p *Telecom: 指向Telecom类型的指针，代表要停止的服务实例。
//
// 返回值:
// 无
func (p *Telecom) Stop() error {
	// 输出停止服务的提示信息，包含服务名称
	log.Printf("Telecom Stop.\n")
	// 调用biSvr的Stop方法，停止服务
	p.biSvr.Stop()
	return nil
}

// ********************************************************************
// sc 相关业务

// Login 处理登录请求
func (p *Telecom) Login(req string) (string, error) {
	var respXMLData string
	var err error

	login := Login{}
	err = login.ParseXML(req)
	fmt.Printf("login: %s\n", login)

	if err == nil {
		// loginAck := LoginAck{}
		// loginAck.
		// 	respXMLData = login.GenXML("")
	} else {
		// 处理解析XML数据失败的情况
		fmt.Println("ParseXML failed:", err)
	}

	return respXMLData, err
}

// AskFactoryconfig 处理获取配置请求
func (p *Telecom) AskFactoryconfig(req string) (string, error) {
	var respXMLData string
	var err error

	return respXMLData, err
}

// SendFactoryconfig 处理获取配置请求
func (p *Telecom) SendFactoryconfig(req string) (string, error) {
	var respXMLData string
	var err error

	return respXMLData, err
}
